home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
serien
/
purity
/
nr.51
/
zmorev0.16
/
zmorev0.16.p
< prev
next >
Wrap
Text File
|
1995-08-27
|
14KB
|
551 lines
{ Programm: ZMore
Version: 0.16 / 12.08.95
Sprache: KickPascal 2.12/OS3.1-Includes
Sinn: einfaches Textanzeigen mit Tastaturunterst.
©: Gilt nur als Mittel des Autors bei Sharware/Lowcost-
Programmen von ihm andere Anzeiger zu meiden, um damit
deren Copyright nicht zu verletzen.
Autor: PackMAN
c/o Falk Zühlsdorff
Lindenberg 66
D-98693 Ilmenau / Thüringen
email: ai036@rz.tu-ilmenau.de }
Program ZMore;
{$incl 'intuition.lib',
'graphics.lib',
'exec.lib',
'gadtools.lib',
'dos.lib',
'workbench/startup.h'};
TYPE p_ZNode = ^ZNode;
ZNode = RECORD
ln_Succ : p_ZNode;
ln_Pred : p_ZNode;
ln_Type : Byte;
ln_Pri : Short;
ln_Name : ^String;
END;
ZList = RECORD
mlh_Head : p_ZNode;
mlh_Tail : p_ZNode;
mlh_TailPred : p_ZNode;
END;
pointerfeld = array[1..40] of Word;
penfeld = ^array[0..7] OF Word; { brauche nur BG-Pen }
VAR Win : p_Window;
Tags : array[0..7] of TagItem; { Win / LV-Gadget }
ZMsg : p_IntuiMessage;
ng : NewGadget;
G,PropGad : p_Gadget;
dummy : boolean; {z.B. für Exit}
myfile : text;
FirstDs,
LastDs : p_ZNode;
ZeilenAnz, {Zeilen d. Dokumentes}
AktPos : LONG;
FileName : String[165];
mylist : Zlist;
MyPropInfo : p_propinfo;
LVZeilen : word; {sichbare Zeilen}
{-------------------- WBScreen / Font... ----------------------}
lib : p_library;
WBScr : p_screen;
di : p_drawinfo;
cm : p_ColorMap; {für ScrVisible}
vpe : p_ViewPortExtra;
Pens : penfeld;
vi : PTR;
txattr : TextAttr;
font : p_textfont;
ysize,xsize,i : word;
zeichen : char;
GList : p_Gadget;
Pointerptr : ^Pointerfeld;
waitreq : Requester;
{--------------------------------------------------------------------}
PROCEDURE Error(Tx:string);
VAR ErrorTextAttr : TextAttr;
ITx,ITxGad : IntuiText;
dummy : boolean;
BEGIN
ErrorTextAttr:=TextAttr('topaz.font',8,0,0);
ITx:=IntuiText(2,0,0,20,10,^ErrorTextAttr,Tx,NIL);
ITxGad:=IntuiText(2,0,0,2,3,^ErrorTextAttr,'OK',NIL);
dummy:=AutoRequest(NIL,^ITx,NIL,^ITxGad,0,0,330,80);
END;
{--------------------------------------------------------------------}
PROCEDURE CloseMisc;
VAR Misc : p_ZNode;
BEGIN
IF Win<>NIL THEN CloseWindow(Win);
IF PointerPTR<>NIL THEN FreeVec(PointerPTR);
IF vi<>NIL THEN FreeVisualInfo(vi);
IF IntuitionBase<>NIL THEN CloseLibrary(IntuitionBase);
IF GfxBase<>NIL THEN CloseLibrary(GfxBase);
IF Gadtoolsbase<>NIL THEN CloseLibrary(Gadtoolsbase);
WHILE FirstDs<>LastDs^.ln_succ DO
BEGIN
Misc:=FirstDs^.ln_succ;
FreeVec(FirstDs^.ln_name);
Dispose(FirstDs);
FirstDs:=Misc;
END;
END;
{------------------------------------------------------------------------}
PROCEDURE GetWBArgs;
VAR WBMsg : p_WBStartup;
help : integer;STATIC;
helpstr : String;STATIC;
BEGIN
helpstr:='';
WBMsg:=StartupMessage;
IF WBMsg^.sm_NumArgs<2
THEN BEGIN FileName:=''; exit; END;
help:=NameFromLock(WBMsg^.sm_ArgList^[2].wa_lock,^Helpstr,80);
IF (HelpStr[Length(HelpStr)])<>':'
THEN FileName:=Concat(HelpStr,'/',WBMsg^.sm_ArgList^[2].wa_name)
ELSE FileName:=Concat(HelpStr,WBMsg^.sm_ArgList^[2].wa_name);
END;
{--------------------------------------------------------------------}
PROCEDURE GetCliArgs;
VAR ParaSTR : String;STATIC;
ParaLen : byte;STATIC;
first,raus : boolean;STATIC;
BEGIN
FileName:='';
IF ParameterSTR<>''
THEN
BEGIN
ParaSTR:='';
ParaSTR:=Copy(ParameterStr,1,ParameterLen);
ParaLen:=1;
first:=true;
raus:=false;
WHILE (ParaLen<=ParameterLen) AND (raus=false) AND
(ParaStr[ParaLen]<>chr(10)) DO
BEGIN
IF ParaSTR[ParaLen]<>' '
THEN
BEGIN
IF first THEN first:=false;
FileName:=FileName+ParaSTR[ParaLen];
END
ELSE IF first=false THEN raus:=true;
INC(ParaLen)
END;
END;
END;
{---------------------------------------------------------------------}
PROCEDURE AddDs;
VAR neu : p_ZNode;
data : string[74];
BEGIN
new(neu);
IF neu=NIL
THEN dummy:=false
ELSE
BEGIN
read(myfile,data);
IF data='' THEN data:=' ';
neu^.ln_name:=AllocVec(strlen(data),MEMF_ANY);
IF neu^.ln_name=NIL
THEN dummy:=false
ELSE
BEGIN
neu^.ln_name^:=data;
neu^.ln_succ:=^mylist.mlh_tail;
neu^.ln_type:=0;
neu^.ln_pri:=0;
IF LastDs=NIL
THEN
BEGIN
neu^.ln_pred:=^mylist.mlh_head;
FirstDs:=neu;
END
ELSE
BEGIN
lastds^.ln_succ:=neu;
neu^.ln_pred:=LastDs;
END;
LastDs:=neu;
INC(ZeilenAnz);
END;
END;
END;
{---------------------------------------------------------------------}
PROCEDURE Jump(Weite,wohin:LONG);
VAR EndNum:LONG;STATIC;
BEGIN
CASE wohin OF
1: IF AktPos-Weite>=0 THEN EndNum:=AktPos-Weite
ELSE EndNum:=0;
2: IF AktPos+Weite<=ZeilenAnz-LVZeilen THEN EndNum:=AktPos+Weite
ELSE EndNum:=ZeilenAnz-LVZeilen;
3: EndNum:=Weite;
ELSE;END;
Tags[2]:=TagItem(GTLV_Top,EndNum);
GT_SetGadgetAttrsA(g,Win,NIL,^Tags[2]);
END;
{--------------------------------------------------------------------}
FUNCTION ListView:boolean;
BEGIN
GList:=NIL;G:=NIL;PropGad:=NIL; MyPropInfo:=NIL;
GList:=CreateContext(^GList);
IF GList=NIL
THEN ListView:=False
ELSE
BEGIN
LVZeilen:=
TRUNC((Win^.GZZHeight-3)/ysize)-1;
ng:=NewGadget(Win^.BorderLeft+TRUNC(xsize/2),
Win^.BorderTop+TRUNC((Win^.GZZHeight-((LVZeilen+1)*ysize))/2)+1,
Win^.GZZWidth-xsize,(LVZeilen+1)*ysize,
NIL,^Txattr,0,0,vi,NIL);
g:=CreateGadgetA(LISTVIEW_KIND,GList,^ng,^Tags[0]);
PropGad:=GList^.NextGadget^.NextGadget;
{-------- OS2 <--> OS3 Gadtools-Inkompatibilität ---------}
IF lib^.lib_version<39
THEN FOR i:=1 TO LVZeilen-1 DO PropGad:=PropGad^.NextGadget;
{---------------------------------------------------------}
MyPropInfo:=PropGad^.SpecialInfo;
MyPropInfo^.Flags:= MyPropInfo^.Flags+PROPNEWLOOK;
i:=AddGList(Win,GList,-1,-1,NIL);
RefreshGList(Win^.FirstGadget^.NextGadget^.NextGadget
^.NextGadget^.NextGadget,Win,nil,-1);
GT_RefreshWindow(Win,NIL);
RefreshWindowFrame(Win);
ListView:=True;
END;
END;
{---------------------------------------------------------------------}
BEGIN
lib:=sysbase;
IF lib^.lib_version<37
THEN BEGIN Error('Needs OS2.x or higher !'); exit;END;
IntuitionBase:=OpenLibrary('intuition.library',37);
GfxBase:=OpenLibrary('graphics.library',37);
Gadtoolsbase:=OpenLibrary('gadtools.library',37);
IF (GfxBase=NIL) OR (IntuitionBase=NIL) OR (Gadtoolsbase=NIL)
THEN CloseMisc;
{---- Anpassung auf sichbaren Bildschirmausschnitt ----}
WBScr:=NIL; FirstDs:=NIL;LastDs:=NIL;ZeilenAnz:=0;
WBScr:=lockpubscreen('Workbench');
IF WBScr<>NIL
THEN
BEGIN
di:=NIL;
cm:=NIL;
vpe:=NIL;
Win:=NIL;
cm:=WBScr^.ViewPort.ColorMap;
vpe:=cm^.cm_vpe;
di:=getscreendrawinfo(WBScr);
IF (di<>NIL) AND (cm<>NIL) AND (vpe<>NIL)
THEN
BEGIN
Pens:=penfeld(di^.dri_Pens);
font:=di^.dri_font;
xsize:=0;
FOR zeichen:=chr($00) TO chr($5E) DO
i:=i+textlength(^WBScr^.rastport,zeichen,1);{Mißbrauch}
i:=i+textlength(^WBScr^.rastport,' ',1);
xsize:=TRUNC(i/96);
ysize:=font^.tf_ysize;
txattr:=TextAttr(di^.dri_font^.tf_Message.mn_Node.ln_Name,
ysize,0,0);
vi:=GetVisualinfoA(WBScr,nil);
freescreendrawinfo(WBScr,di);
UnlockPubScreen(NIL,WBScr);
IF (vpe^.DisplayClip.MaxX+1<(80*xsize)) OR
(vpe^.DisplayClip.MaxY+1<
(WBScr^.WBorBottom+WBScr^.WBorTop+1+14*ysize))
THEN
BEGIN
ysize:=8;
xsize:=8;
txattr:=TextAttr('topaz.font',ysize,0,0);
Font:=OpenFont(^txattr);
END
END
ELSE
BEGIN
Error('Can`t run program...');
CloseMisc;
exit;
END;
END
ELSE {für den Fall, daß alles zu spät ist...}
BEGIN
Error('Can`t find WBench-Screen');
exit;
END;
PointerPTR:=NIL;
PointerPTR:=PTR(AllocVec(SizeOf(pointerfeld),MEMF_CHIP+MEMF_CLEAR));
IF PointerPTR=NIL
THEN BEGIN CloseMisc; exit;END;
PointerPTR^:=Pointerfeld
($0000,$0000,$0400,$07c0,$0000,$07c0,$0100,$0380,
$0000,$07e0,$07c0,$1ff8,$1ff0,$3fec,$3ff8,$7fde,
$3ff8,$7fbe,$7ffc,$ff7f,$7efc,$ffff,$7ffc,$ffff,
$3ff8,$7ffe,$3ff8,$7ffe,$1ff0,$3ffc,$07c0,$1ff8,
$0000,$07e0,$0000,$0000,$0000,$03f2,$0000,$0000);
LVZeilen:=TRUNC((vpe^.DisplayClip.MaxY-(3*ysize)-WBScr^.WBorTop-
WBScr^.WBorBottom)/ysize); { Vorabwert }
{---- Begin des Einlesens d. Files -----}
IF NOT FROMWB
THEN
BEGIN
GetCliArgs;
IF FileName=''
THEN
BEGIN
writeln('No file to display...'); writeln;
CloseMisc;
exit;
END;
END
ELSE
BEGIN
GetWBArgs;
IF FileName=''
THEN
BEGIN Error('ZMore: No file to display');CloseMisc;exit;END;
END;
Reset(myfile,FileName);
IF IOResult<>0
THEN
BEGIN
IF NOT FROMWB
THEN writeln('Can`t open file...')
ELSE Error('ZMore: Can`t open file...');
CloseMisc;
exit;
END;
dummy:=true;
buffer(myfile,50000); { Speedupbuffer }
WHILE (NOT EOF(myfile) AND (dummy)) AND (ZeilenAnz<LVZeilen) DO AddDs;
mylist.mlh_head:=FirstDs;
mylist.mlh_tail:=NIL;
mylist.mlh_tailpred:=NIL;
IF EOF(myfile) THEN BEGIN Close(myfile); dummy:=false END;
AktPos:=0;
Tags[0] :=Tagitem(wa_left,WBScr^.ViewPort.DxOffset*(-1));
Tags[1] :=Tagitem(wa_top,WBScr^.ViewPort.DyOffset*(-1));
Tags[2] :=Tagitem(wa_width,80*xsize);
Tags[3] :=Tagitem(wa_height,vpe^.DisplayClip.MaxY+1);
Tags[4].ti_tag:=wa_title;
Tags[4].ti_data:=
'ZMore V0.16 (c) by PackMAN (Falk Zühlsdorff) 12.08.95';
Tags[5] :=Tagitem(wa_idcmp,IDCMP_RAWKEY+IDCMP_CLOSEWINDOW+
IDCMP_GADGETUP+IDCMP_GADGETDOWN+
IDCMP_INTUITICKS+IDCMP_MOUSEBUTTONS+
IDCMP_MOUSEMOVE+IDCMP_NEWSIZE);
Tags[6] :=Tagitem(wa_flags,WFLG_CLOSEGADGET+WFLG_DEPTHGADGET+
WFLG_WINDOWREFRESH+WFLG_ACTIVATE+
WFLG_DRAGBAR+WFLG_SIZEBBOTTOM+
WFLG_SIZEGADGET+WFLG_RMBTRAP);
Tags[7].ti_tag:=tag_done;
Win:=openwindowtaglist(nil,^Tags[0]);
IF Win=NIL THEN BEGIN CloseMisc; exit END;
Tags[0]:=TagItem(GTLV_ReadOnly,1);
Tags[1]:=TagItem(GTLV_Labels,long(^mylist));
Tags[2]:=TagItem(GTLV_Top,0);
Tags[3].ti_tag:=Tag_End;
IF NOT ListView THEN BEGIN CloseMisc; exit; END;
IF dummy THEN
BEGIN
dummy:=WindowLimits(Win,80*xsize,vpe^.DisplayClip.MaxY+1,
80*xsize,vpe^.DisplayClip.MaxY+1);
{--- Init WaitReq ---}
InitRequester(^waitReq);
dummy:=Request(^waitReq,Win);
SetPointer(Win,PointerPTR,16,16,-6,-1);
{------------------}
WHILE (NOT EOF(myfile) AND (dummy)) DO AddDs;
GT_SetGadgetAttrsA(g,Win,NIL,^Tags[0]);
{--- Clear WaitReq ---}
ClearPointer(Win);
EndRequest(^waitReq,Win);
{-----------------}
Close(myfile);
END;
dummy:=WindowLimits(Win,3*win^.firstgadget^.nextgadget^.Width+2*xsize+
textlength(^WBScr^.rastport,'ZMore',5),
Win^.BorderTop+Win^.BorderBottom+8*ysize,
WBScr^.ViewPort.DWidth,WBScr^.ViewPort.DHeight);
dummy:=false;
REPEAT
ZMsg:=Wait_Port(Win^.UserPort);
ZMsg:=GT_GetIMsg(Win^.Userport);
IF (ZeilenAnz-LVZeilen)>0
THEN AktPos:=ROUND(MyPropInfo^.VertPot/(MAXBODY/(ZeilenAnz-LVZeilen)));
CASE ZMsg^.class OF
IDCMP_CLOSEWINDOW : dummy:=true;
IDCMP_RAWKEY :
CASE ZMsg^.Code OF
$45,
$10: dummy:=true;
$4C,
$3E: BEGIN {up}
IF AktPos>0
THEN
IF (ZMsg^.Qualifier AND
(IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))>0
THEN Jump(LVZeilen,1)
ELSE Jump(1,1);
END;
$4D,
$1E: BEGIN {down}
IF AktPos<ZeilenAnz-LVZeilen
THEN
IF (ZMsg^.Qualifier AND
(IEQUALIFIER_LSHIFT OR IEQUALIFIER_RSHIFT))>0
THEN Jump(LVZeilen,2)
ELSE Jump(1,2);
END;
$3D,
$14: IF AktPos>0 THEN Jump(0,3); {"Home"}
$1D,
$12: IF AktPos<ZeilenAnz-LVZeilen
THEN Jump(ZeilenAnz-LVZeilen,3) {"End"}
$3F: IF AktPos>0 THEN Jump(LVZeilen,1); {"PgUp"}
$1F: IF AktPos<ZeilenAnz-LVZeilen
THEN Jump(LVZeilen,2); {"PgDn"}
$40, {Space}
$43, {Enter}
$44: IF (AktPos<ZeilenAnz) AND
(ZeilenAnz>LVzeilen) THEN Jump(1,2); {Return}
ELSE;END;
IDCMP_NEWSIZE:
BEGIN
SetAPen(Win^.RPort,Pens^[BACKGROUNDPEN]);
RectFill(Win^.RPort,Win^.BorderLeft,Win^.BorderTop,Win^.BorderLeft+
Win^.GZZWidth-1,Win^.BorderTop+Win^.GZZHeight-1);
i:=RemoveGList(Win,GList,-1);
FreeGadgets(glist);
IF NOT ListView THEN BEGIN CloseMisc; exit; END;
END;
ELSE;END;
GT_ReplyIMsg(ZMsg);
UNTIL dummy;
CloseMisc;
FreeGadgets(Glist);
END.